_Pragma("once")
#ifndef TASKITEM_H
#define TASKITEM_H

#include <QString>
#include <QDateTime>
#include <QDate>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QObject>
#include <array>
#include <QVector>
#include "configfile.h"




typedef struct subTask{
    int id=-1;
    int tomato;
    int achieve;
    QString name;
    QString describe;

    subTask(int id_=-1, QString name_="", int tomato_=0,int achieve_=0,QString describe_=""):id(id_),tomato(tomato_),achieve(achieve_),name(name_),describe(describe_){}
} subTask;

class taskItem: public QObject, public QSharedData
{
public:
    Q_OBJECT

public:
    int m_id;        // 任务ID
    int m_sort;      // 任务分类
    unsigned int m_eachDayTomatoes; // 每日番茄数
    int m_tomatoesTotal; // 任务使用番茄总数
    unsigned int m_tomatoesAchieveTotal; // 任务完成的番茄总数
    unsigned int m_todayAchieveTomato;  // 今日使用时间
    QDateTime m_today;           // 最后记录的日期
    int m_days;              // 任务执行天数
    QDateTime m_startDate;       // 任务创建日期
    QString m_taskName;          // 任务名
    QString m_describe;

 // 子任务容器
    QMap<int, subTask> m_subTaskMap;


    int m_currentSubTaskId;




    // 所有任务
    static QMap<int, taskItem*> all_tasks;


    static configFile *configfile;
    static configInfo *config;

    // sort
    static std::array<QString,  5> sortArray;
    static QMap<QString, int> sort2Int;

public:
    explicit taskItem(int id, QString taskName, int sort, unsigned int eachDayTomatoes,int tomatoesTotal , unsigned int todayAchieveTomato, unsigned int tomatoesAchieveTotal,QDateTime today,int days, QDateTime startDate, QString describe,QObject *parent=nullptr);
    explicit taskItem(QString taskName, int sort, unsigned int eachDayTomatoes, int tomatoesTotal, int days, QString describe,QObject *parent=nullptr);
    taskItem(const taskItem & t);
    explicit taskItem(QObject *parent=nullptr);


    // 添加子任务

    void loadSubTask();
    void addSubTask(int id, const QString &name, int tomatoes);
    void addSubTask(const subTask &subtask);

    void copy(const taskItem &t);


    bool deleteSubTask(int subTaskId);


    // 查看今日完成番茄数
    int todayAchieveTomatoes();
    // 查看剩余天数
    int remainDay();
    QString remainDay_str();

    // 番茄数减1
    void addTodayTime(int tomatoCount);

    // 转化sort字符为整数
    static int alterSort2Int(const QString &text);



    // 存储
    void insertdb(QSqlQuery &query);
    void updatedb(QSqlQuery &query);




private:
    // 记录时间是否为今日
    bool isToday();

signals:
    void taskItemChange(taskItem &task);
};

#endif // TASKITEM_H
